package com.rati.usercenter.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.rati.usercenter.model.DTO.TeamInfoDTO;
import com.rati.usercenter.model.VO.TeamVO;
import com.rati.usercenter.model.VO.UserVO;
import com.rati.usercenter.model.domain.Team;
import com.rati.usercenter.model.request.TeamQuery;

import java.util.List;

/**
 * @author Lwh
 * @description 针对表【team(队伍)】的数据库操作Service
 * @createDate 2022-12-23 12:32:35
 */
public interface TeamService extends IService<Team> {

    /**
     * 创建队伍
     *
     * @param team      队伍信息
     * @param loginUser 登录用户
     * @return 新队伍id
     */
    long createTeam(Team team, UserVO loginUser);

    /**
     * 删除队伍
     *
     * @param id          被删除队伍id
     * @param currentUser 当前登录用户
     */
    void deleteTeam(long id, UserVO currentUser);

    /**
     * 更新队伍信息
     *
     * @param teamInfoDTO 新队伍信息
     * @param currentUser 当前登录用户
     */
    void updateTeam(TeamInfoDTO teamInfoDTO, UserVO currentUser);

    /**
     * 根据条件查询队伍
     *
     * @param teamQuery   查询的队伍信息
     * @param currentUser 当前登录的用户
     * @return 队伍列表
     */
    List<TeamVO> listTeam(TeamQuery teamQuery, UserVO currentUser);

    /**
     * 根据用户id获取其创建的队伍
     *
     * @param userId 用户id
     * @return 该用户创建的队伍列表
     */
    List<TeamVO> getCreateTeam(Long userId);

    /**
     * 根据用户id获取其加入的队伍
     *
     * @param userId 用户id
     * @return 该用户加入的队伍列表
     */
    List<TeamVO> getJoinedTeam(Long userId);

    /**
     * 用户通过id加入队伍
     *
     * @param teamId      队伍id
     * @param password    密码（可选）
     * @param currentUser 当前登录用户
     */
    void joinTeamById(long teamId, String password, UserVO currentUser);

    /**
     * 用户退出队伍
     *
     * @param teamId      队伍id
     * @param currentUser 当前登录用户
     */
    void quitTeam(long teamId, UserVO currentUser);

    /**
     * 改变队伍队长
     *
     * @param teamId      队伍id
     * @param newLeaderId 新队长id
     */
    void changeLeaderTo(long teamId, Long newLeaderId);

    /**
     * 根据队伍id获取成员数量
     *
     * @param teamId 队伍id
     * @return 成员数量
     */
    long countMem(long teamId);

    /**
     * 判断某用户是否是某队伍的队长（创建人）
     *
     * @param userId 用户id
     * @param teamId 队伍id
     * @return 是否是队长
     */
    boolean isLeader(long userId, long teamId);

    /**
     * 判断某用户是否是某队伍的成员
     *
     * @param userId 用户id
     * @param teamId 队伍id
     * @return 是否是成员
     */
    boolean isMember(long userId, long teamId);

    /**
     * 复制其他属性和时间属性 String -> LocalDateTime
     */
    void copyAndSetTime(TeamInfoDTO teamInfoDTO, Team team);

}
